window.jsonParse = function() {
	var r = "(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)", k = '(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
	k = '(?:"' + k + '*")';
	var s = new RegExp(
			"(?:false|true|null|[\\{\\}\\[\\]]|" + r + "|" + k + ")", "g"), t = new RegExp(
			"\\\\(?:([^u])|u(.{4}))", "g"), u = {
		'"' : '"',
		"/" : "/",
		"\\" : "\\",
		b : "\u0008",
		f : "\u000c",
		n : "\n",
		r : "\r",
		t : "\t"
	};
	function v(h, j, e) {
		return j ? u[j] : String.fromCharCode(parseInt(e, 16));
	}
	var w = new String(""), x = Object.hasOwnProperty;
	return function(h, j) {
		h = h.match(s);
		var e, c = h[0], l = false;
		if ("{" === c)
			e = {};
		else if ("[" === c)
			e = [];
		else {
			e = [];
			l = true;
		}
		for ( var b, d = [ e ], m = 1 - l, y = h.length; m < y; ++m) {
			c = h[m];
			var a;
			switch (c.charCodeAt(0)) {
			default:
				a = d[0];
				a[b || a.length] = +c;
				b = void 0;
				break;
			case 34:
				c = c.substring(1, c.length - 1);
				if (c.indexOf("\\") !== -1)
					c = c.replace(t, v);
				a = d[0];
				if (!b)
					if (a instanceof Array)
						b = a.length;
					else {
						b = c || w;
						break;
					}
				a[b] = c;
				b = void 0;
				break;
			case 91:
				a = d[0];
				d.unshift(a[b || a.length] = []);
				b = void 0;
				break;
			case 93:
				d.shift();
				break;
			case 102:
				a = d[0];
				a[b || a.length] = false;
				b = void 0;
				break;
			case 110:
				a = d[0];
				a[b || a.length] = null;
				b = void 0;
				break;
			case 116:
				a = d[0];
				a[b || a.length] = true;
				b = void 0;
				break;
			case 123:
				a = d[0];
				d.unshift(a[b || a.length] = {});
				b = void 0;
				break;
			case 125:
				d.shift();
				break;
			}
		}
		if (l) {
			if (d.length !== 1)
				throw new Error;
			e = e[0];
		} else if (d.length)
			throw new Error;
		if (j) {
			var p = function(n, o) {
				var f = n[o];
				if (f && typeof f === "object") {
					var i = null;
					for ( var g in f)
						if (x.call(f, g) && f !== n) {
							var q = p(f, g);
							if (q !== void 0)
								f[g] = q;
							else {
								i || (i = []);
								i.push(g);
							}
						}
					if (i)
						for (g = i.length; --g >= 0;)
							delete f[i[g]];
				}
				return j.call(n, o, f);
			};
			e = p({
				"" : e
			}, "");
		}
		return e;
	};
}();
